/*
位运算
*/

#include <stdio.h>

#include <stdlib.h>

int main(int argc, char const *argv[])
{
	char str[33];

	//========================按位与(&)只有在两个二进制数都为1的情况下，结果才为1.=====================
	int a=4;

	itoa(a,str,2);

	printf("%d的二进制形式是%s\n",a,str);   //00000000	00000000	00000000	00000100	

	int b=7;

	itoa(b,str,2);

	printf("%d的二进制形式是%s\n",b,str);   //00000000	00000000	00000000	00000111


	int c=a&b;


	itoa(c,str,2);


	printf("%d的二进制形式是%s\n",c,str);   //00000000	00000000	00000000	00000100

	//任何一个数与0进行按位与的话，结果都是0；


	//判断一个数的奇偶,这个数与1进行按位与运算，结果为0就表明这个数是偶数，结果为1就表明这个数是奇数。

	int d=a&1;

	printf("%d\n",d);


	//====按位或运算，将参与运算的两个数据进行逻辑或运算.只要有一个数是1，或的结果都为1======
	printf("===按位或运算，将参与运算的两个数据进行逻辑或运算.只要有一个数是1，或的结果都为1===\n");

	int e=9;//00000000 00000000 00000000 00001001
	int f=5;//00000000 00000000 00000000 00000101
	        //00000000 00000000 00000000 00001101

	int g=e|f;

	printf("%d|%d=%d\n",e,f,g);

	g=g|0xFF; //0xFF 16进制数，表示255.

	printf("g=%d\n",g);

	//====按位异或运算，将参与运算的两个数据进行逻辑异或运算.只要两个数相反，异或的结果都为1======
	printf("===按位异或运算，将参与运算的两个数据进行逻辑异或运算.只要两个数相反，异或的结果都为1===\n");

	int h=9;//00000000 00000000 00000000 00001001
	int i=5;//00000000 00000000 00000000 00000101
            //00000000 00000000 00000000 00001100
	int j=h^i;

	printf("%d^%d=%d\n",h,i,j);

	printf("===按位异或运算,两个数互换===\n");

	h=h^i;
	i=i^h;
	h=h^i;
	printf("%d\n%d\n",h,i);

	printf("===左移运算===将数据对应的二进制逐位左移若干位\n");
	int l=3;//00000000 00000000 00000000 00000011
	l=l<<4; //00000000 00000000 00000000 00110000
	//左移运算规则:高位丢失，低位补上。左移n位，就是将原数的值乘以2的n次方
	printf("3<<4=%d\n",l);
	printf("===右移运算===将数据对应的二进制逐位右移若干位\n");
	printf("===右移n位，除以2的n次方\n");

	l=l>>4;

	printf("48>>4=%d\n", l);




















	return 0;
}